这篇博文主要是我在学习 Java Annotation 时的笔记和感悟。学习 Java web 开发会发现,现在越来越多的 Web 开发框架慢慢舍弃不必要的传统的 XML、properties 等配置文件,使用 Annotation 的方式来配置框架程序运行时所需的信息和配置。这种比较轻便的注解配置的方式也使得程序开发更加快捷,更利于程序维护,至少当程序中 Java 代码更改之后,不需要在另外一个地方的 XML 修改配置。
Java 语言中的 Annotation 为何物?
Java 在 1.5 版本开始以特殊的元数据(关于数据信息的数据)的形式引入注解(Annotation)。那么究竟什么是 Java 中的 Annotation 呢? 看下它的定义:
Annotation 是 Java 语言中的一种特殊的元数据语法,可以被添加到 Java 代码中。类,方法,变量,参数,包都可以被标注。与 Javadoc 的标签不同,注解是可以被反射的,因为他们被编译器生成嵌入在编译后文件,并保留在虚拟机中以便在运行时被索引。
Annotation 是与一个程序元素关联信息或者元数据的标注。它不影响 Java 程序的执行,但是对例如编译器警告或者像文档生成器等辅助工具产生影响。
从定义中可以了解到,Java Annotation 是一种用来标注数据或者程序语言元素信息的“工具”,它不会改变程序的执行过程,但是可以利用相关的工具根据 Annotation 的具体定义和内容对它标注的数据进行一些操作。
Java 中内建的注解(Built-in Annotation)和自定义注解
在使用 Java 的过程中,我们会碰到的内建注解不多,比较常见的是 @Override
@Deprecated
@SuppressWarnings
这三个,具体作用不再详细叙述。
主要说一下 Java 自定义的注解。
怎么定义一个注解
下面是一个自定义注解的例子:
|
|
从这个例子中可以看到:
自定义注解的类型为
@interface
自定义注解可以被元注解标记,比如
@Document
自定义注解可以有“方法属性”,并且可以提供一个默认值作为返回值
元注解
上面例子展示了定义自己的注解的时候可以使用的元注解,包括 @Documented
, @Target
, @Retention
和 @Inherited
这四个。下面是这四个元注解的源代码和他们的作用。
- @Document
源代码和用法如下:
|
|
- @Target
他的源码和用法:
|
|
其中可以使用的 Vlaue 为:
|
|
- @Retention
源码和用法:
|
|
可以使用的 Value 和对应的意义
|
|
- @Inherited
源码和使用方法:
|
|
自定义注解的使用
注解如果没有被解析和使用,和标记在对应位置的注释是一样的。
那么如何解析注解呢?
利用 Java 提供的 APT(Annotation processing tools)
这一块比较不常用吧,而且需要篇幅说明,如果有兴趣,请阅读:利用反射(前提是注解的 @Retention 为 RUNTIME )
下面是利用反射来解释注解的例子:
|
|
总结
注解的定义和使用很方便,也很简单,如何合理的设计注解成为关键性的步骤。通常需要全面考虑自己的需求,然后制定合理的注解层次。
那么 Spring 里面是怎么使用注解的呢?可以参考下它的源代码和别人的文章,这里就不在赘述。也许等我学习到 Spring 的源代码的时候会去看下。
注解的解释用到了反射技术,众所周知的是反射的效率不高,所以,我们应该把对注解的处理尽量放在初始化的时候进行,并且做好缓存。
结束。